home *** CD-ROM | disk | FTP | other *** search
- ;*
- ;
- ; ### Paddle routines by JM v 0.50 ###
- ;
- ; - Created 900715 by JM -
- ;
- ;
- ; This program reads paddles connected to mouse port #2.
- ;
- ;
- ; Bugs: yet unknown
- ;
- ;
- ; Edited:
- ;
- ; - 900715 by JM -> v0.01 - Basics from vertb.asm.
- ; - 900716 by JM -> v0.02 - Should work but worketh not.
- ; - 900717 by JM -> v0.50 - Worketh. Needed a call to WritePotgo().
- ;
- ;
-
- include "bb.i"
- include "exec/types.i"
- include "exec/execbase.i"
- include "exec/tasks.i"
- include "exec/nodes.i"
- include "exec/memory.i"
- include "exec/io.i"
- include "exec/interrupts.i"
- include "hardware/intbits.i"
- include "hardware/custom.i"
- include "libraries/dos.i"
-
-
- OUTRY equ 1<<15
- DATRY equ 1<<14
- OUTRX equ 1<<13
- DATRX equ 1<<12
-
- OUTLY equ 1<<11
- DATLY equ 1<<10
- OUTLX equ 1<<9
- DATLX equ 1<<8
-
- START equ 1
-
-
- STRUCTURE mv_VERTB,0 ; oma muuttuja-alue
- APTR mv_maintask ; paaohjelman task-osoite
- APTR mv_potgores ; resourcen osoite
- ULONG mv_sigmask ; signaalimaski
- UWORD mv_potdata ; luettu data
- UWORD mv_firedata ; nappuloiden tilat
- LABEL mv_SIZE ; struktuurin koko
-
-
- .var global
- dlibb Dos,Potgo
- dl potbits
- db VERTB_signal,int_added
-
- .share mem,#MEMF_CLEAR!MEMF_PUBLIC
- dm interrupt[IS_SIZE]
- dm data[mv_SIZE]
- dm buffer[256]
-
- main .begin
- ra
- st VERTB_signal ; lippu: sigbit ei varattu
-
- openlib Dos,cleanup
-
- lea.s "potgo.resource",a1
- moveq #0,d0
- call OpenResource ; avataan potgo.resource
- move.l d0,.PotgoBase
- beq cleanup
-
- move.l #OUTRY|DATRY|OUTRX|DATRX|START,d0 ; tarvittavat bitit
- move.l d0,d2
- call AllocPotBits
- move.l d0,potbits ; varatut bitit
- cmp.l d0,d2
- bne cleanup ; ei saatu kaikkia bittejä
-
- share mem,cleanup ; varataan muisti
-
- move.l data,a2 ; muuttuja-alueen osoite
- moveq #-1,d0 ; mika tahansa bitti kelpaa
- call AllocSignal ; varataan signaali
- move.b d0,VERTB_signal ; tallennetaan bitin nro
- moveq #0,d1
- bset d0,d1 ; asetetaan sigbit-bitti
- move.l d1,mv_sigmask(a2) ; tallennetaan signaalimaski
- move.l .PotgoBase,mv_potgores(a2) ; resourcen osoite
-
- sub.l a1,a1
- call FindTask ; etsitaan oma task
- move.l d0,mv_maintask(a2) ; osoite muuttujatilaan
-
- move.l interrupt,a1 ; Interrupt-struktuuri
- move.b #NT_INTERRUPT,LN_TYPE(a1) ; noden tyyppi = INTERRUPT
- move.b #1,LN_PRI(a1) ; noden prioriteetti = 1
- lea intr_name(pc),a0 ; noden nimi
- move.l a0,LN_NAME(a1) ; nimen osoite struktuuriin
- lea.l irqcode(pc),a0 ; keskeytysrutiinin osoite
- move.l a0,IS_CODE(a1) ; osoite struktuuriin
- move.l a2,IS_DATA(a1) ; muuttuja-alueen osoite
- moveq #INTB_VERTB,d0 ; keskeytyksen tyyppi
- call AddIntServer ; käynnistetään keskeytys
- st int_added
-
- loop moveq #0,d0
- move.b VERTB_signal,d1 ; odotetaan keskeytyksen
- bset d1,d0 ; antamaa signaalia
- moveq #SIGBREAKB_CTRL_C,d1 ; ja CTRL+C:n painamista
- bset d1,d0
- call Wait ; ohjelma nukkumaan
- btst #SIGBREAKB_CTRL_C,d0
- bne cleanup
-
- moveq #0,d0
- moveq #0,d1
- moveq #0,d2
- move.l data,a2
- move.b mv_potdata(a2),d0
- move.b mv_potdata+1(a2),d1
- move.w mv_firedata(a2),d2
-
- lea.s " Paddle value: %3.3d %3.3d Fire: %02.2x",13,a0
- move.w d2,-(sp)
- move.w d1,-(sp)
- move.w d0,-(sp)
- move.l sp,a1
-
- lea.l putch(pc),a2 ; putchar-rutiinin osoite
- move.l buffer,a3 ; tulostuspuskuri
-
- call RawDoFmt ; formatoidaan tulostus
- addq.l #6,sp ; sp takaisin kohdalleen
- move.l a3,d2
- sub.l d2,d7 ; lasketaan rivin pituus
- move.l d7,d3
-
- call Output ; tulostustiedosto
- move.l d0,d1
- beq.s cleanup ; nolla -> ei voida tulostaa
- fcall Write ; tulostus
-
- bra loop
-
- putch move.b d0,(a3)+
- move.l a3,d7
- rts
-
- cleanup tst.b int_added ; keskeytysrutiini
- .if ne ; toiminnassa?
- move.l interrupt,a1
- moveq #INTB_VERTB,d0
- call RemIntServer ; poistetaan keskeytykset
- .end
-
- moveq #0,d0
- move.b VERTB_signal,d0 ; vapautetaan signaalibitti
- .if pl ; jos se oli varattu
- call FreeSignal
- .end
-
- move.l potbits,d0
- .if ne
- call FreePotBits
- .end
-
- freesh mem ; vapautetaan muisti
- closlib Dos
- moveq #0,d0 ; virhekoodi = 0
- .end
-
-
-
- irqcode lea $dff000,a0 ; custom-piirit
- move.w pot1dat(a0),mv_potdata(a1) ; luetaan paddle
- move.w joy1dat(a0),d0 ; painikkeet
- move.w d0,d1
- lsr.w #1,d1
- and.w #$0101,d1 ; muut bitit pois
- eor.w d1,d0
- move.w d0,d1
- and.w #$0003,d0 ; taas liiat pois
- and.w #$0300,d1 ; tästä myös
- lsr.w #6,d1 ; molemmat tavut samaan
- or.b d1,d0
- move.w d0,mv_firedata(a1) ; nappuloiden tilat
- move.l mv_potgores(a1),a5 ; potgo base talteen
- move.l mv_sigmask(a1),d0 ; signaalimaski
- move.l mv_maintask(a1),a1 ; taski
- call Signal ; annetaan signaali
- move.l a5,a6 ; potgo base
- moveq #1,d0
- moveq #1,d1 ; käynnistetään uusi muunnos
- fcall WritePotgo
- moveq #0,d0 ; tieto Execille, että
- rts ; keskeytysketju voi jatkua
-
-
- intr_name:
- dc.b 'My_Paddle_Intr',0 ; keskeytyksen nimi
-
- .purge
-
- end
-
-
-